#pragma once

#include <iostream>
#include <unordered_map>
#include <vector>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>
#include <string>
#include <cstring>
#include <functional>
#include <memory>
#include <regex>
#include <assert.h>
#include <typeinfo>
#include <ctime>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL INF // 将日志等级设置为INF

// 使用宏函数用\是为了将\r转义,因为宏只允许一行代码
// format: 声明类型
// ...: (参数)不定参的使用
#define LOG(level, format, ...) do{\
        if(level < LOG_LEVEL) break;\
        time_t t = time(NULL);\
        struct tm* lmt = localtime(&t);\
        char tmp[32];\
        strftime(tmp, 31, "%H:%M:%S", lmt);\
        /* ##_VA_ARGS__是解决空参数下的场景 */ \
        fprintf(stdout, "[%s %s:%d] " format "\n", tmp, __FILE__, __LINE__, ##__VA_ARGS__);\
    }while(0)

#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

